// const { ccclass, property } = cc._decorator;
// import o from "./frameworkManager"

// @ccclass
// export default class HotUpdate {
//     constructor() {
//         this._updating = false;
//         this._canRetry = false;
//         this._failCount = 0;
//         this._canUpdate = false;
//         this._checkListener = null;
//         this._updateListener = null;
//         this._baseVersion = null;
//         this._curVersion = null;
//         this._isOnlineRelease = null;
//         if (cc.sys.isNative) {
//             // this._storagePath = (jsb.fileUtils ? jsb.fileUtils.getWritablePath() : "/") + "remote-asset";
//             // cc.log("Storage path for remote asset : " + this._storagePath);
//             // this.versionCompareHandle = function(e, t) {
//             // cc.log("JS Custom Version Compare: version A is " + e + ", version B is " + t);
//             // for (var a = e.split("."), o = t.split("."), i = 0; i < a.length; ++i) {
//             // var r = parseInt(a[i]), n = parseInt(o[i] || "0");
//             // if (r !== n) return r - n;
//             // }
//             // return o.length > a.length ? -1 : 0;
//             // };
//             // this._am = new jsb.AssetsManager("", this._storagePath, this.versionCompareHandle);
//             // this._am.setVerifyCallback(function(e, t) {
//             // var a = t.compressed, o = t.md5, i = t.path;
//             // t.size;
//             // if (a) {
//             // console.log("Verification passed : " + i);
//             // return true;
//             // }
//             // console.log("Verification passed : " + i + " (" + o + ")");
//             // return true;
//             // });
//             // console.log("Hot update is ready, please check or directly update.");
//         }
//     }
//             e.getInstance() {
//         this._instance || (this._instance = new e());
//         return this._instance;
//     };
//     private _canRetry: boolean;
//     private _failCount: number;
//     private _canUpdate: boolean;
//     private _checkListener: Function;
//     private _updateListener: Function;

//     get canRetry(): boolean {
//         return this._canRetry;
//     }

//     set canRetry(value: boolean) {
//         this._canRetry = value;
//     }

//     get failCount(): number {
//         return this._failCount;
//     }

//     set failCount(value: number) {
//         this._failCount = value;
//     }

//     get canUpdate(): boolean {
//         return this._canUpdate;
//     }

//     set canUpdate(value: boolean) {
//         this._canUpdate = value;
//     }

//     set checkListener(listener: Function) {
//         this._checkListener = listener;
//     }

//     set updateListener(listener: Function) {
//         this._updateListener = listener;
//     }
//     public checkCb(e) {
//         this._canUpdate = false;
//         cc.log("Code: " + e.getEventCode());
//         switch (e.getEventCode()) {
//             case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
//                 console.log("No local manifest file found, hot update skipped.");
//                 break;

//             case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
//                 console.log("Fail to download manifest file, hot update skipped0.");
//                 break;

//             case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
//                 console.log("Fail to parse manifest file, hot update skipped0.");
//                 break;

//             case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
//                 console.log("Already up to date with the latest remote version.");
//                 break;

//             case jsb.EventAssetsManager.NEW_VERSION_FOUND:
//                 console.log("New version found, please try to update. (" + this._am.getTotalBytes() + ")");
//                 this._canUpdate = false;
//                 break;

//             default:
//                 return;
//         }
//         this._am.setEventCallback(null);
//         this._updating = false;
//         this._checkListener && this._checkListener(this._canUpdate);
//     };
//     public updateCb(e) {
//         var t = false, a = false, o = e.getEventCode(), i = {
//             code: o
//         };
//         switch (o) {
//             case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
//                 console.log("No local manifest file found, hot update skipped.");
//                 a = true;
//                 break;

//             case jsb.EventAssetsManager.UPDATE_PROGRESSION:
//                 i.byte_percent = e.getPercent();
//                 i.file_percent = e.getPercentByFile();
//                 i.file_downloaded = e.getDownloadedFiles();
//                 i.file_total = e.getTotalFiles();
//                 i.byte_downloaded = e.getDownloadedBytes();
//                 i.byte_total = e.getTotalBytes();
//                 var r = e.getMessage();
//                 r && console.log("Updated file: " + r);
//                 break;

//             case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
//                 console.log("Fail to download manifest file, hot update skipped1.");
//                 a = true;
//                 break;

//             case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
//                 console.log("Fail to parse manifest file, hot update skipped1.");
//                 a = true;
//                 break;

//             case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
//                 console.log("Already up to date with the latest remote version.");
//                 a = true;
//                 break;

//             case jsb.EventAssetsManager.UPDATE_FINISHED:
//                 console.log("Update finished. " + e.getMessage());
//                 t = true;
//                 break;

//             case jsb.EventAssetsManager.UPDATE_FAILED:
//                 console.log("Update failed. " + e.getMessage());
//                 this._updating = false;
//                 this._canRetry = true;
//                 a = true;
//                 break;

//             case jsb.EventAssetsManager.ERROR_UPDATING:
//                 console.log("Asset update error: " + e.getAssetId() + ", " + e.getMessage());
//                 a = true;
//                 break;

//             case jsb.EventAssetsManager.ERROR_DECOMPRESS:
//                 console.log("Asset decompress" + e.getMessage());
//                 a = true;
//         }
//         if (a) {
//             this._am.setEventCallback(null);
//             this._updating = false;
//             if (this._updateListener) {
//                 this._updateListener(-1, i);
//                 this._updateListener = null;
//             }
//         } else if (t) {
//             this._am.setEventCallback(null);
//             var n = jsb.fileUtils.getSearchPaths(), l = this._am.getLocalManifest().getSearchPaths();
//             console.log("newPaths", JSON.stringify(l));
//                     Arrapublic unshift.apply(n, l);
//             cc.sys.localStorage.setItem("HotUpdateSearchPaths", JSON.stringify(n));
//             jsb.fileUtils.setSearchPaths(n);
//             this._updateListener = null;
//             cc.audioEngine.stopAll();
//             cc.game.restart();
//         } else this._updateListener && this._updateListener(0, i);
//     };
//     public retry() {
//         if (!this._updating && this._canRetry) {
//             this._canRetry = false;
//             console.log("Retry failed Assets...");
//             this._am.downloadFailedAssets();
//         }
//     };
//     public _initManifest() {
//         // if (cc.sys.isNative) {
//         //     this._am.getState() === jsb.AssetsManager.State.UNINITED && this._am.loadLocalManifest("project.manifest");
//         //     var e = this._am.getLocalManifest(), t = e ? e.getVersion() : "1.0.0.0";
//         //     console.log("local manifest version", e ? e.getVersion() : "load failed");
//         //     console.log("local version url", e ? e.getVersionFileUrl() : "load failed");
//         //     this._curVersion = t;
//         //     return t;
//         // }
//     };
//     public getVersion() {
//         return null != this._curVersion ? this._curVersion : cc.sys.isNative ? this._initManifest() : "1.0.0.0";
//     };
//     public getBaseVersion() {
//         if (null != this._baseVersion) return this._baseVersion;
//         if (!cc.sys.isNative) return "";
//         if (!jsb.fileUtils.isFileExist("projectCfg.json")) return "";
//         var e = jsb.fileUtils.getStringFromFile("projectCfg.json");
//         console.log("getProjectCfg", e);
//         if (null != e && "" != e) {
//             var t = JSON.parse(e), a = "release" == t.version || "prod" == t.version;
//             console.log("isRelease", a);
//             this._isOnlineRelease = a;
//             var o = t.base_version;
//             console.log("BaseVersion", o);
//             this._baseVersion = o;
//             return o;
//         }
//         return "";
//     };
//     public isOnlineRelease() {
//         if (null != this._isOnlineRelease) return this._isOnlineRelease;
//         if (!cc.sys.isNative) return false;
//         if (!jsb.fileUtils.isFileExist("projectCfg.json")) return false;
//         var e = jsb.fileUtils.getStringFromFile("projectCfg.json");
//         console.log("getProjectCfg", e);
//         if (null != e && "" != e) {
//             var t = JSON.parse(e), a = "release" == t.version || "prod" == t.version;
//             console.log("isRelease", a);
//             this._isOnlineRelease = a;
//             var o = t.base_version;
//             console.log("BaseVersion", o);
//             this._baseVersion = o;
//             return a;
//         }
//         return false;
//     };
//     public checkUpdate(e) {
//         if (cc.sys.isNative) if (this._updating) console.log("Checking or updating ..."); else {
//             this._am.setEventCallback(this.checkCb.bind(this));
//             e && (this._checkListener = e);
//             this._initManifest();
//             if (this._am.getLocalManifest() && this._am.getLocalManifest().isLoaded()) {
//                 this._am.checkUpdate();
//                 this._updating = true;
//             } else console.log("Failed to load local manifest ...");
//         } else e && e(false);
//     };
//     public hotUpdate(e) {
//         e && e(-1, {});
//         return;
//         if (cc.sys.isNative) {
//             e && (this._updateListener = e);
//             if (this._am && !this._updating) {
//                 this._am.setEventCallback(this.updateCb.bind(this));
//                 this._initManifest();
//                 this._failCount = 0;
//                 this._am.update();
//                 this._updating = true;
//             }
//         } else e && e(-1, {});
//     };
//     public getGrayVersion(e, t) {
//         var a = new XMLHttpRequest();
//         a.onreadystatechange() {
//             if (4 == a.readyState) if (a.status >= 200 && a.status < 400) {
//                 var e = a.responseText;
//                 // if (e) {
//                 //     if (t) {
//                 //         console.log("返回版本信息");
//                 //         console.log(e);
//                 //         var o = JSON.parse(e);
//                 //         t(o);
//                 //     }
//                 // } else {
//                 console.log("返回数据不存在");
//                 t && t(false);
//                 // }
//             } else console.log("请求失败");
//         };
//         a.open("POST", e, true);
//         a.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
//         a.send();
//         a.addEventListener("abort", function () {
//             cc.log("testlogin abort");
//             t(false);
//         });
//         a.addEventListener("error", function () {
//             cc.log("testlogin error");
//             t && t(false);
//         });
//         a.addEventListener("timeout", function () {
//             cc.log("testlogin timeout");
//             t && t(false);
//         });
//     };
//     public checkGrayUpdate(e, t) {
//         console.log("checkGrayUpdate", e);
//         e += "&game_version=" + this.getVersion();
//         // if (cc.sys.isNative) if (this._updating) console.log("Checking or updating ..."); else {
//         //     this._am.setEventCallback(this.checkCb.bind(this));
//         //     t && (this._checkListener = t);
//         //     this._initManifest();
//         //     if (this._am.getLocalManifest() && this._am.getLocalManifest().isLoaded()) {
//         //         var a = this, i = this._storagePath + "_temp/version.manifest.temp", r = this._storagePath + "_temp/project.manifest.temp";
//         //         this.getGrayVersion(e,  (e) => {
//         //             o.log("热更新返回的数据====", e);
//         //             if (1 == e.code) {
//         //                 console.log("update1111====");
//         //                 var n = new jsb.Downloader();
//         //                 n.createDownloadFileTask(e.url, i, "@temp_version");
//         //                 n.setOnTaskError(function (e, o, i, r) {
//         //                     console.log("errorCode = ", o);
//         //                     console.log("errorCodeInternal = ", i);
//         //                     console.log("errorStr = ", r);
//         //                     console.log("error task = ", e.identifier);
//         //                     a._updating = false;
//         //                     t && t(false);
//         //                 });
//         //                 n.setOnTaskProgress(function (e, t, a, o) {
//         //                     if ("@temp_manifest" == e.identifier) {
//         //                         console.log("manifest downloaded ", t);
//         //                         console.log("manifest total received", a);
//         //                         console.log("manifest total expected ", o);
//         //                     } else {
//         //                         console.log("version downloaded ", t);
//         //                         console.log("version total received", a);
//         //                         console.log("version total expected ", o);
//         //                     }
//         //                 });
//         //                 n.setOnFileTaskSuccess( (e) => {
//         //                     if ("@temp_manifest" == e.identifier) {
//         //                         console.log("manifest download success");
//         //                         var o = new jsb.Manifest(r);
//         //                         a._am.loadRemoteManifest(o);
//         //                     } else {
//         //                         console.log("version download success");
//         //                         var l = (o = new jsb.Manifest(i)).getVersion();
//         //                         jsb.fileUtils.removeFile(i);
//         //                         console.log("local version", a._curVersion);
//         //                         console.log("remote version", l);
//         //                         if (a.versionCompareHandle(a._curVersion, l) < 0) {
//         //                             console.log("tempManifest", r, o.getManifestFileUrl());
//         //                             n.createDownloadFileTask(o.getManifestFileUrl(), r, "@temp_manifest");
//         //                         } else {
//         //                             a._updating = false;
//         //                             t && t(false);
//         //                         }
//         //                     }
//         //                 });
//         //             } else {
//         //                 a._updating = false;
//         //                 t && t(false);
//         //             }
//         //         });
//         //         this._updating = true;
//         //     } else console.log("Failed to load local manifest ...");
//         // } else 
//         t && t(false);
//     };
// }